package model

import (
	"fmt"
	"strings"

	"gitee.com/liumou_site/logger"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/json"

	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
	dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
)

// GetParseList 获取域名解析列表并解析为结构体
// 该函数通过腾讯云API获取指定域名的解析记录，并将结果解析为结构体，最后将解析结果存储在Login结构体的相关字段中。
// 如果启用了调试模式，函数会输出调试信息。
func (l *Login) GetParseList() error {
	var res AutoGenerated

	// 调试模式下输出日志
	if l.Debug {
		logger.Debug("正在获取域名解析列表")
	}

	// 实例化腾讯云认证对象，使用SecretId和SecretKey进行认证
	credential := common.NewCredential(
		l.Domain.Login.Id,
		l.Domain.Login.Key,
	)

	// 配置客户端选项，设置API请求的端点
	cpf := profile.NewClientProfile()
	cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"

	// 实例化腾讯云DNS客户端
	client, _ := dnspod.NewClient(credential, "", cpf)

	// 创建获取域名解析记录的请求对象
	request := dnspod.NewDescribeRecordListRequest()
	request.Domain = common.StringPtr(l.Domain.Domain.Domain)
	request.Subdomain = common.StringPtr(l.Domain.Domain.Sub)

	// 发送请求并获取响应
	response, err := client.DescribeRecordList(request)
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		logger.Error("An API error has returned: ", err)
		return err
	}
	if err != nil {
		logger.Error("An API error has returned: ", err)
		return err
	}

	// 将响应结果解析为结构体
	l.Err = json.Unmarshal([]byte(response.ToJsonString()), &res)
	if l.Err != nil {
		logger.Error("json格式化失败: ", err)
		return err
	}
	if len(res.Response.RecordList) == 0 {
		logger.Info("当前无解析记录")
		return nil
	}

	// 遍历解析结果，将域名信息存储在Login结构体中
	for _, v := range res.Response.RecordList {
		if l.Debug {
			fmt.Println(v)
		}
		info := DomainInfo{Sub: v.Name,
			Ip:       v.Value,
			RecordId: v.RecordID,
			Type:     v.Type}
		l.SubList = append(l.SubList, v.Name)
		l.DomainInfoList = append(l.DomainInfoList, info)
	}
	return nil
}

// GetRecordId 获取指定子域名的解析记录ID
// 该方法用于查找并设置当前子域名的解析记录ID，区分IPv4(A记录)和IPv6(AAAA记录)
func (l *Login) GetRecordId(sub string) {
	// 如果域名信息列表为空，先获取解析列表
	if len(l.DomainInfoList) == 0 {
		err := l.GetParseList()
		if err != nil {
			logger.Error("获取解析列表失败: ", err)
			return
		}
	}
	// 再次检查，如果仍然为空则报错返回
	if len(l.DomainInfoList) == 0 {
		logger.Error("无法获取解析列表,请检查配置参数")
		return
	}

	// 初始化Exists标志为false
	l.Exists = false

	// 遍历域名信息列表查找匹配的子域名
	for _, v := range l.DomainInfoList {
		if l.Debug {
			logger.Debug("正在匹配子域名: ", v.Sub, " ->", sub)
		}
		// 使用不区分大小写的比较查找子域名
		if strings.EqualFold(v.Sub, sub) {
			// 调试模式下输出日志
			if l.Debug {
				logger.Debug("记录已存在: ", sub)
			}

			// 设置记录存在标志和基础记录ID
			l.Exists = true
			l.RecordId = v.RecordId

			// 根据记录类型设置IPv6或IPv4的记录ID
			if strings.EqualFold(v.Type, "AAAA") {
				l.RecordId6 = v.RecordId // 设置IPv6记录ID
				l.IPS.IpType = "AAAA"
			}
			if strings.EqualFold(v.Type, "A") {
				l.RecordId4 = v.RecordId // 设置IPv4记录ID
				l.IPS.IpType = "A"
			}

			// 调试模式下输出当前解析ID
			if l.Debug {
				logger.Debug("当前解析ID: ", l.RecordId)
			}
			return
		}
	}
}

// GetAnalyticalValue 根据当前记录的ID获取对应的解析值(IP地址)
// 该方法遍历DomainInfoList列表，查找与当前RecordId匹配的记录
// 如果找到匹配记录，将记录的IP地址赋值给Login结构体的Value字段并返回nil
// 如果未找到匹配记录，返回错误信息"无法获取解析记录"
func (l *Login) GetAnalyticalValue() error {
	for _, v := range l.DomainInfoList {
		if v.RecordId == l.RecordId {
			l.Value = v.Ip
			return nil
		}
	}
	return fmt.Errorf("无法获取解析记录")
}
